#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QIcon>
#include <QEvent>

#include "mainwidget.h"

//////////////////////////////////////
/// item 的类型
//////////////////////////////////////

enum ItemType {
    SessionType,
    FriendType,
    ApplyType
};

//////////////////////////////////////
/// 会话列表中的好友区域
//////////////////////////////////////

class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    // 往 container 中添加一个 item
    // 如果是 SessionItem,id 是 sessionId
    // 如果是 FriendItem/ApplyItem,id 是 userId
    void addItem(ItemType type, const QString& id, const QIcon& avatar,
                 const QString& name, const QString& text);
    // 清空 container 中所有的 item
    void clear();
    // 通过下标选中滚动区域中的 item
    void clickItem(int index);

private:
    QWidget* container;

signals:
};

//////////////////////////////////////
/// 滚动区域中的 item
//////////////////////////////////////

class SessionFriendItem : public QWidget
{
    Q_OBJECT
public:
    SessionFriendItem(QWidget* owner, const QIcon& avatar,
                const QString& name, const QString& text);

    virtual void paintEvent(QPaintEvent *) override;
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void enterEvent(QEnterEvent *event) override;
    virtual void leaveEvent(QEvent *event) override;

    // 选中当前 item
    void select();
    // 点击当前 item 对应的业务逻辑
    virtual void active();

public:
    QWidget* owner; // 指向 SessionFriendArea

    bool selected = false; // 当前 Item 是否被选中

    QLabel* msgLabel; // last msg of current session
};

//////////////////////////////////////
/// 会话 item
//////////////////////////////////////

class SessionItem : public SessionFriendItem
{
    Q_OBJECT;
public:
    SessionItem(const QString& sessionId, QWidget* owner, const QIcon& avatar,
                const QString& name, const QString& msg);

    void active() override;

private:
    QString sessionId;

    QString text; // last message

    void updateLastMessage(const QString& chatSessionId);
};

//////////////////////////////////////
/// 好友 item
//////////////////////////////////////

class FriendItem : public SessionFriendItem
{
    Q_OBJECT
public:
    FriendItem(const QString& userId, QWidget* owner, const QIcon& avatar,
               const QString& name, const QString& msg);

    void active() override;

private:
    QString userId;
};

//////////////////////////////////////
/// 申请 item
//////////////////////////////////////

class ApplyItem : public SessionFriendItem
{
    Q_OBJECT
public:
    ApplyItem(const QString& userId, QWidget* owner, const QIcon& avatar,
              const QString& name);

    void active() override;

    void acceptFriendApply();
    void rejectFriendApply();

private:
    QString userId;
};

#endif // SESSIONFRIENDAREA_H
